$fn=100;

/* [Dart Holder] */
// Outer diamter of the cylinder that anchors dart.
cylDia=5;
// Total height of the dart holder.
cylHeight=9;
// Inner solid part that keeps dart from potruding into air cone.
cylSolidPart=2;
// Clearence that makes inner opening tighter so that dart can be melted into it.
meltClearence=0.2;
/* [Air Cone] */
// Diameter of air cone end.
coneDia=16;
coneDia1=cylDia;
// Height of air cone.
coneHeight=19.0;
// Thickness of cone walls.
coneWall=0.5;
/* [Dart] */
// Diameter of dart wire.
dartDia=2.5;

//////////////////////////////////////////////////////////////////////////////////////////////
// main
union()
{
    makeCone();
    makeCylinder();
}

//////////////////////////////////////////////////////////////////////////////////////////////
// make cone that catches the air
module makeCone()
{
    translate([0,0,coneHeight/2])
    difference()
    {
    cylinder(h=coneHeight, r1=coneDia/2, r2=coneDia1/2, center=true);
    cylinder(h=coneHeight+0.2, r1=(coneDia/2-coneWall), r2=(coneDia1/2-coneWall), center=true);
    }
}

//////////////////////////////////////////////////////////////////////////////////////////////
// make cylinder that holds the dart
module makeCylinder()
{
    translate([0,0,coneHeight-0.01])
    difference()
    {
        union()
        {
        translate([0,0,(cylHeight-cylDia/2)/2]) 
                cylinder(h=cylHeight-cylDia/2, r1=cylDia/2, r2=cylDia/2, center=true);
        translate([0, 0, (cylHeight-cylDia/2)]) 
                sphere(d=cylDia);
        }
        
        translate([0,0,(cylHeight-cylSolidPart)/2+cylSolidPart+0.01])
        cylinder(h=cylHeight-cylSolidPart, r1=dartDia/2-meltClearence, r2=dartDia/2, center=true);
    }
}
